package com.example.demo7;

import javafx.scene.canvas.GraphicsContext;
import javafx.scene.paint.Color;

import static com.example.demo7.RPGgame.playerX;
import static com.example.demo7.RPGgame.playerY;

// 敌人类
public class Enemy {
    double x, y;        // 敌人坐标
    double speed;       // 移动速度
    int health;        // 当前生命值
    int maxHealth;     // 最大生命值
    int damage;       // 攻击伤害
    int type;        // 敌人类型
    int shootCooldown; // 射击冷却时间(帧数)
    int shootTimer;   // 射击计时器
    public static final int ENEMY_SIZE = 30;       // 敌人大小
    /**
     * 敌人构造函数
     *
     * @param x    初始X坐标
     * @param y    初始Y坐标
     * @param type 敌人类型(0=普通,1=快速,2=强力)
     */
    Enemy(double x, double y, int type) {
        this.x = x;
        this.y = y;
        this.type = type;

        // 根据敌人类型设置属性
        switch (type) {
            case 0: // 普通敌人
                speed = 1.5;
                health = maxHealth = 30;
                damage = 5;
                shootCooldown = 120; // 2秒
                break;
            case 1: // 快速敌人
                speed = 2.5;
                health = maxHealth = 20;
                damage = 3;
                shootCooldown = 90; // 1.5秒
                break;
            case 2: // 强力敌人
                speed = 1.0;
                health = maxHealth = 50;
                damage = 8;
                shootCooldown = 150; // 2.5秒
                break;
        }
        shootTimer = shootCooldown; // 初始化射击计时器
    }

    /**
     * 更新敌人状态
     *
     * @param playerX 玩家X坐标
     * @param playerY 玩家Y坐标
     */
    void update(double playerX, double playerY) {
        // 计算到玩家的方向向量
        double dx = playerX - x;
        double dy = playerY - y;
        double dist = Math.sqrt(dx * dx + dy * dy);

        // 移动敌人
        if (dist > 0) {
            dx /= dist; // 标准化X分量
            dy /= dist; // 标准化Y分量

            // 计算新位置
            double newX = x + dx * speed;
            double newY = y + dy * speed;

            // 检查墙壁碰撞
            if (!RPGgame.checkCollisionWithWalls(newX, newY, ENEMY_SIZE / 2)) {
                x = newX;
                y = newY;
            }
        }

        // 更新射击计时器
        if (shootTimer > 0) {
            shootTimer--;
        }
    }

    /**
     * 检查敌人是否可以射击
     *
     * @return 是否可以射击
     */
    boolean canShoot() {
        // 计算到玩家的距离
        double dx = playerX - x;
        double dy = playerY - y;
        double dist = Math.sqrt(dx * dx + dy * dy);

        // 如果玩家在范围内且冷却结束
        if (dist < 300 && shootTimer <= 0) {
            shootTimer = shootCooldown; // 重置计时器
            return true;
        }
        return false;
    }

    /**
     * 敌人受到伤害
     *
     * @param amount 伤害值
     */
    void takeDamage(int amount) {
        health -= amount;
    }

    /**
     * 绘制敌人
     *
     * @param gc 图形上下文
     */
    void draw(GraphicsContext gc) {
        // 根据敌人类型设置颜色
        switch (type) {
            case 0:
                gc.setFill(Color.RED);
                break;
            case 1:
                gc.setFill(Color.ORANGE);
                break;
            case 2:
                gc.setFill(Color.PURPLE);
                break;
        }

        // 绘制敌人圆形
        gc.fillOval(x - ENEMY_SIZE / 2, y - ENEMY_SIZE / 2, ENEMY_SIZE, ENEMY_SIZE);

        // 绘制生命值条
        double barWidth = ENEMY_SIZE;
        double barHeight = 5;
        double barX = x - barWidth / 2;
        double barY = y - ENEMY_SIZE / 2 - 10;

        // 生命值条背景
        gc.setFill(Color.DARKRED);
        gc.fillRect(barX, barY, barWidth, barHeight);

        // 当前生命值
        double healthPercent = (double) health / maxHealth;
        gc.setFill(Color.RED);
        gc.fillRect(barX, barY, barWidth * healthPercent, barHeight);

        // 生命值条边框
        gc.setStroke(Color.BLACK);
        gc.setLineWidth(1);
        gc.strokeRect(barX, barY, barWidth, barHeight);
    }
}